perm filename AAA[LSP,BGB] blob
sn#041582 filedate 1973-05-15 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00029 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00004 00002 TITLE SALISP - SAIL Accessible LISP - November 1972.
00005 00003 SAIL JOBDAT ADDRESSES.
00006 00004 AC DEFINITIONS AND EXTERNALS --- PAGE 1
00008 00005 ALTERNATE PDP-10 MNEMONICS.
00009 00006 UUO definitions
00012 00007 system UUOs
00014 00008 ALLOCATION DIALOGUE SUBROUTINE.
00017 00009 LISP TO SAIL.
00018 00010 SAIL TO LISP.
00020 00011 Compute size of Halfword Bit Table and Half Word Space.
00022 00012 Initialize the values of the BPORG & BPEND atoms.
00024 00013 Initialize the OBLIST in HWS.
00025 00014 Relocate CAR of cell.
00026 00015 Intern the atom on the OBLIST.
00028 00016 TOP LEVEL AND INITIALIZATION --- PAGE 2
00030 00017 INITFN: EXCH A,INITF#
00031 00018 APR INTERRUPT ROUTINES --- PAGE 3
00033 00019 UUO HANDLER AND SUBR CALL ROUTINES --- PAGE 4
00035 00020 SKIPA T,TT
00036 00021 ARGPDL: LDB T,[POINT 4,JOBUUO,ACFLD]
00037 00022 r←0 ←> compiler calling a -
00039 00023 UUOS5: CAR R,(T)
00040 00024 ERROR HANDLER AND BACKTRACE --- PAGE 5
00042 00025 subroutine to search oblist for closest function to address in r
00044 00026 dispatcher for error message uuos
00046 00027 ERROR2: CDR A,JOBUUO
00048 00028 error messages
00049 00029 backtrace subroutine
00052 ENDMK
⊗;
TITLE SALISP - SAIL Accessible LISP - November 1972.
;storage allocation map.
orgLSP: . ;LISP interpreter.
sizLSP: efolst-.-1
endLSP: efolst-1
orgBPS: 0 ;Binary Program Space.
sizBPS: 2000
endBPS: 0
orgHWS: 0 ;Half Word Space.
sizHWS: 0
endHWS: 0
orgFWS: 0 ;Full Word Space.
sizFWS: 1000
endFWS: 0
orgHBT: 0 ;Halfwords Bit Tables.
sizHBT: 0
endHBT: 0
orgFBT: 0 ;Fullwords Bit Table
sizFBT: 0
endFBT: 0
orgPDL: 0 ;regular PDL.
sizPDL: 1000
endPDL: 0
orgSPD: 0 ;special PDL.
sizSPD: 1000
endSPD: 0
;SAIL JOBDAT ADDRESSES.
SAI41: 0
SAIAPR: 0
;SAIL ACCUMULATORS.
for @' i←0,17{AC'i: 0↔}
;LISP ACCUMULATORS.
LISPAC: BLOCK 20
;Olde switch and pointers.
RETFLG: 0
BSFLG: 0 ;Boot Strape initialization done.
SUBTTL AC DEFINITIONS AND EXTERNALS --- PAGE 1
INUMIN←377777
INUM0←<INUMIN+777777>/2
BCKETS←←177
;accumulator definitions
;`sacred' means sacred to the interpreter
;`marked' means marked from by the garbage collector
;`protected' means protected during garbage collection
↓NIL←0 ;sacred, marked, protected ;atom head of NIL
↓A←1 ;marked, protected ;1st arg & function result.
↓B←A+1 ;marked, protected ;second arg of subrs
↓C←B+1 ;marked, protected ;third arg of subrs
↓AR1←4 ;marked, protected ;fourth arg of subrs
↓AR2A←5 ;marked, protected ;fifth arg of subrs
↓T←6 ;marked, protected ;minus number of args in LSUBR call
↓TT←7 ;marked, protected
↓REL←10 ;marked, protected ;rarely used
↓S←11 ;rarely used
↓D←12
↓R←13 ;protected
↓P←14 ;sacred, protected ;regular push down stack pointer
↓F←15 ;sacred ;free storage list pointer
↓FF←16 ;sacred ;full word list pointer
↓SP←17 ;sacred, protected ;special pushdown stack pointer
NACS←←5 ;number of argument acs
X←←0 ;X indicates impure (modified) code locations
TEN←←=10
;ALTERNATE PDP-10 MNEMONICS.
OPDEF LIP[HLR]
OPDEF LAP[HRR]
OPDEF DIP[HRLM]
OPDEF DAP[HRRM]
OPDEF CAR[HLRZ]
OPDEF CDR[HRRZ]
OPDEF DIPZ[HRLZM]
OPDEF DAPZ[HRRZM]
OPDEF LAC[MOVE]
OPDEF DAC[MOVEM]
OPDEF LACN[MOVN]
OPDEF DACN[MOVNM]
;The foolst macro marks LISP Space References.
DEFINE FOO <
XLIST
BAZ(→FOOCNT)
LIST
>
DEFINE BAZ '(X)
<FOOCNT←FOOCNT+1
FOO'X:
>
FOOCNT←0
;UUO definitions
;UUOs used to call functions from compiled code
;the number of arguments is given by the ac field
;the address is a pointer either to the function
;name or the code of the function
OPDEF FCALL [34B8] ;ordinary function call, like PUSHJ
OPDEF JCALL [35B8] ;terminal function call, like JRST
OPDEF CALLF [36B8] ;like call but may not be changed to PUSHJ
OPDEF JCALLF [37B8] ;like jcall but may not be changed to JRST
;error UUOs
OPDEF ERR1 [1B8] ;ordinary lisp error ;gives backtrace
OPDEF ERR2 [2B8] ;space overflow error ;no backtrace
OPDEF ERR3 [3B8] ;ill. mem. ref.
OPDEF STRTIP [4B8] ;print error message and continue
;external and internal symbols
EXTERNAL JOB41 ;instruction to be executed on UUO
EXTERNAL JOBAPR ;address of APR interupt routines
EXTERNAL JOBCNI ;interupt condition flags
EXTERNAL JOBFF ;first location beyond program
EXTERNAL JOBREL ;top of core image.
EXTERNAL JOBREN ;reentry address
EXTERNAL JOBSA ;starting address
EXTERNAL JOBSYM ;address of symbol table
EXTERNAL JOBTPC ;program counter at time of interupt
EXTERNAL JOBUUO ;uuo with its effective address.
;apr flags
PDOV←←200000 ;push down list overflow
MPV←←20000 ;memory protection violation
NXM←←10000 ;non-existant memory referenced
APRFLG←←PDOV+MPV+NXM ;any of the above
;system uuos
APRINI←←16
RESET←←0
STIME←←27
DEVCHR←←4
EXIT←←12
CORE←←11
;system UUOs
OPDEF TTYUUO [51B8]
OPDEF INCHRW [TTYUUO 0,]
OPDEF OUTCHR [TTYUUO 1,]
OPDEF OUTSTR [TTYUUO 3,]
OPDEF INCHWL [TTYUUO 4,]
OPDEF INCHSL [TTYUUO 5,]
OPDEF CLRBFI [TTYUUO 11,]
DEFINE TALK{PUSHJ P,TTYCLR}
;I/O bits and constants
TTYLL←←105 ;teletype linelength
LPTLL←←160 ;line printer linelength
MLIOB←←203 ;max length of I/O buffer
NIOB←←2 ;no of I/O buffers per device
NIOCH←←7 ;number of I/O channels
FSTCH←←11 ;first I/O channel
TTCH←←10 ;teletype I/O channel
COUNT←←10
BLKSIZE←←NIOB*MLIOB+COUNT+1
INB←←2
OUTB←←1
AVLB←←40
DIRB←←4
;special ASCII characters
ALTMOD←←175
SPACE←←40 ;space
IGCRLF←←32 ;ignored cr-lf
RUBOUT←←177
LF←←12
CR←←15
TAB←←11
BELL←←7
DBLQT←←42 ;double quote "
;byte pointer field definitions
ACFLD←←14 ;ac field
XFLD←←21 ;index field
OPFLD←←10 ;opcode field
ADRFLD←←43 ;adress field
;ALLOCATION DIALOGUE SUBROUTINE.
ALLOCD: 0
OUTSTR [ASCIZ /
ALLOC? /]
INCHRW C
CAIGE C,"O"
JRST @ALLOCD
OUTSTR [ASCIZ /
FULL WDS=/]
JSR ALLNUM
SKIPGE A
MOVEI A,400
DAC A,sizFWS
OUTSTR [ASCIZ /
BIN.PROG.SP=/]
JSR ALLNUM
SKIPGE A
MOVEI A,2000
DAC A,sizBPS
OUTSTR [ASCIZ /
SPEC.PDL=/]
JSR ALLNUM
SKIPGE A
MOVEI A,1000
DAC A,sizSPD
OUTSTR [ASCIZ /REG. PDL=
/]
JSR ALLNUM
SKIPGE A
MOVEI A,1000
DAC A,sizPDL
JRST @ALLOCD
ALLNUM: 0
MOVSI A,400000 ;high bit on for no digits
INCHRW C
CAIN C,RUBOUT
JRST [OUTSTR [ASCIZ /XXX /]
JRST ALLNUM+1]
CAIL C,"0"
CAILE C,"9"
JRST @ALLNUM
TLZ A,400000 ;turn off hi bit on digit
IMULI A,10
ADDI A,-"0"(C)
JRST ALLNUM+2
;LISP TO SAIL.
INTERN SAIL
SAIL: LAC SAI41
DAC JOB41
LAC SAIAPR
DAC JOBAPR
LAC 0,[XWD AC1,1]
BLT 0,17
LAC 0,AC0
SUB 17,[XWD 2,2]
JRST @2(17)
;SAIL TO LISP.
INTERN LISP
EXTERN CORGET
;ACCUMULATOR-2 POINTER TO FIRST WORD OF SAIL MEMORY BLOCK.
;ACCUMULATOR-3 SIZE OF SAIL MEMORY BLOCK.
LISP: DAC 0,AC0
LAC 0,[XWD 1,AC1]
BLT 0,AC17
LAC 3,-1(17)
PUSHJ 17,CORGET
JFCL
;JSR ALLOCD ;Allocation dialogue.
OUTSTR [ASCIZ/
/]
;Bottom, Size & Top of LISP memory space.
lac B,2↔lac S,3↔lac T,B
addi T,-1(S)
movei 1(B)↔dip B,0↔setzm(B)↔blt(T)
;Take BPS off the bottom
dac B,orgBPS
add B,sizBPS
dac B,endBPS
sos endBPS
sub S,sizBPS
;Take SPD off the top.
dac T,endSPD
sub T,sizSPD
dac T,orgSPD
aos orgSPD
sub S,sizSPD
;Compute FWS size ← 400+S/16.
lac A,S
ash A,-4
addb A,sizFWS
;Compute FBT size.
idivi A,44
addi A,2
dac A,sizFBT
;Compute PDL size.
lac A,S
ash A,-6
addm A,sizPDL
;Compute size of Halfword Bit Table and Half Word Space.
sub S,sizFBT
sub S,sizFWS
sub S,sizPDL
lac A,S
idivi A,41
addi A,2 ;fractional words possible fore and aft.
dac A,sizHBT
sub S,A
dac S,sizHWS
;Take Half Word Space, HWS, off the bottom.
lac T,endBPS
movei B,1(T)
dac B,orgHWS
add B,sizHWS
add T,sizHWS
dac T,endHWS
;allocate Full Word Space, FWS above HWS.
dac B,orgFWS
add B,sizFWS
add T,sizFWS
dac T,endFWS
;allocate Halfword Bit Table, HBT above FWS.
dac B,orgHBT
add B,sizHBT
add T,sizHBT
dac T,endHBT
;allocate Fullword Bit Table, FBT above HBT.
dac B,orgFBT
add B,sizFBT
add T,sizFBT
dac T,endFBT
;allocate Push Down List, PDL above FBT.
dac B,orgPDL
add B,sizPDL
add T,sizPDL
dac T,endPDL
;Initialize the values of the BPORG & BPEND atoms.
LAC A,orgBPS
ADDM A,VBPORG ;value of BPORG.
LAC A,endBPS
ADDM A,VBPEND ;value of BPEND.
;Setup Special PDL pointer.
LACN A,SIZSPD
hrlz A,A
lap A,orgSPD
sos A
dac A,SC2
;lowest word of PDL holds pointer to OBLIST.
LAC B,orgPDL
LAC A,orgHWS
DAC A,(B)
;setup regular PDL pointer.
ADDI B,12
DAP B,C2
LACN C,SIZPDL
ADDI C,20
DIP C,C2
;Fixup references to HWS.
lac FF,orgHWS
addi FF,bckets ;ATOMS'.
subi FF,ATOMS
MOVEI C,FOOLST
REL5: LAC B,(C)↔ CDR A,(B)↔ ADD A,FF↔ DAP A,(B)
LIP B, B ↔ CDR A,(B)↔ ADD A,FF↔ DAP A,(B)
CAIGE C,EFOLST-1
AOJA C,REL5
;Initialize the OBLIST in HWS.
hrlzi A,1-bckets
lap A,orgHWS
aos A
dapz A,-1(A)
aobjn A,.-1
;Initialize pointers for atomic relocation.
movei F,ATOMS+2 ;From here.
lac T,orgHWS
addi T,bckets+2 ;To there
lac TT,endHWS ;Top To there.
FOO hrli TT,PNAME ;PNAME property.
lac FF,orgFWS ;pname full words.
lac REL,T↔sub REL,F ;relocation displacement.
;Save pointer to Atom Head for OBLIST interning.
tdza S,S ;The first atom is NIL.
REL0: lac S,T
;Relocate CAR of cell.
REL1: car A,(F) ;get From atoms.
caige A,ATOME ;skip too high.
caige A,ATOMS ;step too low.
skipa ;not in HWS.
add A,REL
dip A,(T)
;Relocate CDR of cell.
cdr A,(F)
caige A,ATOME
caige A,ATOMS
skipa
add A,REL
dap A,(T)
;Advance down property list.
aos F ↔ aos T ;advance pointers in Sync.
jumpn A,REL1 ;test for end of list.
;Intern the atom on the OBLIST.
lac A,(F) ;get 1st word of pname.
lsh A,-1
idivi A,bckets
add B,orgHWS ;bucket pointer.
car A,(B)
FOO cain S,UNBOUND
jrst .+5 ; Don't intern UNBOUND.
dip TT,(B) ;put a node in the bucket.
dap A,(TT)
dip S,(TT) ;put atom head in the node.
sos TT ;new top of HWS.
;Take two words off the top of HWS for PNAME property pair.
dipz T,(TT) ;(pnlist . NIL)
dac TT,-1(TT) ;(PNAME . (pnlist . NIL))
sos TT
dap TT,-1(T) ;NCONC pname pair on property list.
sosa TT ;new top of HWS and Skip.
;Make pname Full Word List.
REL2: dap T,-1(T) ;PNAME list continued.
lac(F)↔dac(FF)
dipz FF,(T) ;put FW pointer in list.
aos F ↔ aos T ↔ aos FF ;advance pointers in Sync.
hlre(F)↔aose ;test for atom head, End of Ascii.
jrst REL2
;Mark end of PNLIST.
caige F,ATOME ;End of Atoms.
jrst REL0
setzb F,DDTIFG
jsr IOBRST
jrst START
SUBTTL TOP LEVEL AND INITIALIZATION --- PAGE 2
START: ;CALLI RESET
LAC [JSR UUOH]
EXCH JOB41
MOVEM SAI41
MOVEI APRINT
EXCH JOBAPR
DAC SAIAPR
MOVEI APRFLG
CALLI APRINI
HRRZI 17,1
SETZB 0,PSAV1
BLT 17,17 ;clear acs
LSPRT1: SETOM ERRSW ;print error messages
SETZM ERRTN ;return to top level on errors
SETOM PRVCNT# ;initialize counter for errio
MOVE P,C2# ;initial reg pdl ptr
MOVE SP,SC2# ;initial spec pdl ptr
LISP1X: PUSHJ P,TTYRET ;(outc nil t)(inc nil t).
FOO HRROI 0,CNIL2 ;initialize nil
SKIPN FF+X
PUSHJ P,AGC ;garbage collect only if necessary
SKIPN BSFLG# ;initial bootstrap for macros
JRST BOOTS
;SKIPE RETFLG ;test for error return
;JRST [ SKIPE A,INITF
; CALLF (A) ;evaluate initialization function
; SETZM RETFLG
; JRST .+1]
LISP2: PUSHJ P,TTYRET ;return all i/o to tty
PUSHJ P,TERPRI
SKIPE GOBF# ;garbaged oblist flag
STRTIP [SIXBIT /GARBAGED OBLIST←!/]
SETZM GOBF
SKIPE BPSFLG#
JRST BINER2 ;binary program space exceeded by loader
LISP1: PUSHJ P,READ ;this is the top level of lisp
PUSHJ P,EVAL
PUSHJ P,PRINT
PUSHJ P,TERPRI
JRST LISP1
INITFN: EXCH A,INITF#
POPJ P,
;return from lisp error or bell
LSPRET: PUSHJ P,TERPRI
SKIPE PSAV1# ;bell from alvine?
JRST [ MOVE P,PSAV1 ;yes, return to alvine
CDR REL,ED
JRST 1(REL)] ;improved magic
MOVE B,SC2
PUSHJ P,UBD ;unbind specpdl
SETOM RETFLG ;set return flag
JRST LSPRT1
.RSET: EXCH A,RSTSW#
POPJ P,
;bootstrapper for macro definitions
BOOTS: SETOM BSFLG
MOVEI A,BSTYI
PUSHJ P,READP1
PUSHJ P,EVAL
PUSHJ P,READ
JRST .-2
BSTYI: ILDB A,[POINT 7,[ASCII /(INC(INPUT SYS:(LISP.LSP)))/]]
POPJ P,
SUBTTL APR INTERRUPT ROUTINES --- PAGE 3
;arithmetic processor interupts
;mem. protect. violation, nonex. mem. or pdl overflow
APRINT: MOVE R,JOBCNI ;get interupt bits
TRNE R,MPV+NXM ;what kind
ERR3 @JOBTPC ;an ill mem ref-will become JRST ILLMEM
JUMPN NIL,MES21 ;a pdl overflow
STRTIP [SIXBIT /←PDL OVERFLOW FROM GC - CAN'T CONTINUE!/]
JRST START
MES21: SETZM JOBUUO
SKIPL P
STRTIP [SIXBIT /←REG !/]
SKIPL SP
STRTIP [SIXBIT /←SPEC !/]
SKIPE JOBUUO
SPDLOV: ERR2 [SIXBIT /PUSHDOWN CAPACITY EXCEEDED !/]
TRNE R,PDOV
SKIPE JOBUUO
HALT ;lisp should not be here
BINER2: SETZM BPSFLG
ERR2 [SIXBIT /BINARY PROGRAM SPACE EXCEEDED !/]
ILLMEM: LDB R,[POINT 4,@JOBTPC,XFLD];get index field of bad word
CAIE R,F ;does it contain f
ERR3 @JOBTPC ;no! error
PUSHJ P,AGC ;yes! garbage collect
JRST @JOBTPC ;and continue
SUBTTL UUO HANDLER AND SUBR CALL ROUTINES --- PAGE 4
UUOMIN←←1
UUOMAX←←4
UUOH: X ;jsr location
MOVEM T,TSV#
MOVEM TT,TTSV#
LDB T,[POINT 9,JOBUUO,OPFLD] ;get opcode
CAIGE T,34 ;is it a function call
JRST ERROR ;or a LISP error
HLRE R,@JOBUUO
AOJN R,UUOS
LDB T,[POINT 4,JOBUUO,ACFLD]
CAILE T,15
MOVEI R,-15(T)
CDR T,@JOBUUO
UUOH1: CAR TT,(T)
CDR T,(T)
FOO CAIN TT,SUBR
JRST @UUST(R)
FOO CAIN TT,FSUBR
JRST @UUFST(R)
FOO CAIN TT,LSUBR
JRST @UULT(R)
FOO CAIN TT,EXPR
JRST @UUET(R)
FOO CAIN TT,FEXPR
JRST @UUFET(R)
CDR T,(T)
JUMPN T,UUOH1
PUSH P,A
PUSH P,B
CDR A,JOBUUO
FOO MOVEI B,VALUE
PUSHJ P,GET
JUMPN A,[ CDR TT,(A)
POP P,B
POP P,A
JRST UUOEX1]
CDR A,JOBUUO
PUSHJ P,EPRINT
ERR1 [SIXBIT /UNDEFINED UUO!/]
SKIPA T,TT
UUOSBR: CAR T,(T)
MOVE TT,JOBUUO
HRLI T,(<PUSHJ P,>)
TLNE TT,1000 ;1000 means no push
TLCA T,34600 ;<PUSHJ P,>xor<JRST>
PUSH P,UUOH
SOS UUOH
UUOCL: TLNN TT,2000+X ;2000 means no clobber
MOVEM T,@UUOH
MOVE TT,TTSV
EXCH T,TSV
JRST @TSV
UUOS: CDR TT,JOBUUO
CAMLE TT,orgHWS
CAML TT,orgFWS
JRST UUOSBR-1
JRST .+2
UUOEXP: CAR TT,(T)
UUOEX1: LDB T,[POINT 5,JOBUUO,ACFLD]
TRZN T,20
PUSH P,UUOH
PUSH P,TT
JUMPE T,IAPPLY
CAIN T,17
MOVEI T,1
MOVNS T
HRLZ TT,T
PUSH P,A(TT)
AOBJN TT,.-1
JRST IAPPLY
ARGPDL: LDB T,[POINT 4,JOBUUO,ACFLD]
MOVNS T
HRLZ R,T
ARGP1: JUMPE R,(TT)
PUSH P,A(R)
AOBJN R,.-1
JRST (TT)
QTIFY: PUSHJ P,NCONS
FOO MOVEI B,CQUOTE
JRST XCONS
QTLFY: MOVEI A,0
QTLFY1: JUMPE T,(TT)
EXCH A,(P)
PUSHJ P,QTIFY
POP P,B
PUSHJ P,CONS
AOJA T,QTLFY1
PDLARG: JRST .+NACS+2(T)
POP P,A+5
POP P,A+4
POP P,A+3
POP P,A+2
POP P,A+1
POP P,A
JRST (TT)
NOUUO: MOVSI B,(<TLNN TT,>)
SKIPE A
MOVSI B,(<TLNA>)
HLLM B,UUOCL
EXCH A,NOUUOF#
POPJ P,
;r←0 ←> compiler calling a -
;r←1 ←> compiler calling a lsubr
;r←2 ←> compiler calling f type
UUST: UUOSBR
UUOS1 ;calling l its a subr
UUOS2 ;calling f
UUFST: UUOS9 ;calling - its a f
UUOS10 ;calling l
UUOSBR
UULT: UUOS7 ;calling - its a l
UUOSBR
UUOS8
UUET: UUOEXP
UUOS5 ;calling l its an expr
UUOS6 ;calling f its an expr
UUFET: UUOS3 ;calling - its a fexpr
UUOS4 ;calling l
UUOEXP
UUOS1: CAR R,(T)
MOVE T,TSV
JSP TT,PDLARG
JRST (R)
UUOS3: PUSH P,(T)
JSP TT,ARGPDL
UUOS4A: JSP TT,QTLFY
MOVEI TT,1
DPB TT,[POINT 4,JOBUUO,ACFLD]
UUOS6A: POP P,TT
HLRZS TT
JRST UUOEX1
UUOS4: PUSH P,(T)
MOVE T,TSV
JRST UUOS4A
UUOS5: CAR R,(T)
MOVE T,TSV
JSP TT,PDLARG
MOVE TT,R
JRST UUOEX1
UUOS6: PUSH P,(T)
PUSH P,UUOH
PUSH P,JOBUUO
JSP TT,ILIST
JSP TT,PDLARG
POP P,JOBUUO
POP P,UUOH
JRST UUOS6A
UUOS8: SKIPA TT,CILIST
UUOS7: MOVEI TT,ARGPDL
DAP TT,UUOS7A
MOVE TT,JOBUUO
TLNN TT,1000
PUSH P,UUOH
CAR TT,(T)
UUOS7A: JRST ARGPDL+X ;or ilist
UUOS9: PUSH P,T
JSP TT,ARGPDL
UUS10A: JSP TT,QTLFY
MOVSI T,2000
IORM T,JOBUUO
POP P,T
JRST UUOSBR
UUOS10: PUSH P,T
MOVE T,TSV
JRST UUS10A
SUBTTL ERROR HANDLER AND BACKTRACE --- PAGE 5
;subroutine to print sixbit error message
ERRSUB: MOVSI A,(<POINT 6,0>)
HRR A,JOBUUO
MOVEM A,ERRPTR#
ERRORB: ILDB A,ERRPTR
CAIN A,01 ;conversion from sixbit
POPJ P,
CAIN A,77
JRST [ PUSHJ P,TERPRI
JRST ERRORB]
ADDI A,40
PUSHJ P,TYO
JRST ERRORB
;subroutine to return output to previously selected device
OUTRET: SKIPL PRVCNT ;if prvcnt<0 then no device deselect.
SOSL PRVCNT ;when prvcnt goes negative, then reselect
POPJ P,
PUSH P,PRVSEL# ;previously selected output
POP P,TYOD
POPJ P,
;subroutine to force error messages out on tty
ERRIO: MOVE B,ERRSW
CAIE B,INUM0 ;INUM0 means use selected device.
AOSLE PRVCNT ;if prvcnt<0 then deselect.
POPJ P,
TALK ;undo control o
MOVE B,[JRST TTYO]
EXCH B,TYOD
MOVEM B,PRVSEL
POPJ P,
ERRTN: 0 ;0 ←> top level *
;- ←> pdl to reset to - stored by errorset
;+ ←> string tyo pout rtn flag
ERRSW: -1 ;0 means no prnt on error *
;subroutine to search oblist for closest function to address in r
ERSUB3:
FOO MOVEI A,QST
FOO HRROI NIL,CNIL2
HRLZI B,BCKETS
MOVNS B
LAP B,orgHWS
SETZB AR2A,GOBF
PUSH P,JOBAPR
MOVEI C,[ SETOM GOBF
JRST ERRO2G]
DAP C,JOBAPR
CAR C,(B)
ERRO2B: JUMPE C,[ AOBJN B,.-1
POP P,JOBAPR ;oblist done, restore
JRST PRINC] ;print closest match
CAR TT,(C)
ERRO2C: CDR TT,(TT)
JUMPE TT,ERRO2G
CAR AR1,(TT)
FOO CAIN AR1,LSUBR
JRST ERRO2H
FOO CAIE AR1,SUBR
FOO CAIN AR1,FSUBR
JRST ERRO2H
CDR TT,(TT)
JRST ERRO2C
ERRO2H: CDR TT,(TT)
CAR TT,(TT)
CAMLE TT,AR2A ;le to prefer car to quote
CAMLE TT,R
JRST ERRO2G
MOVE AR2A,TT
CAR A,(C)
ERRO2G: CDR C,(C)
JRST ERRO2B
;dispatcher for error message uuos
ERROR: MOVEI A,APRFLG
CALLI A,APRINI ;enable interupts
LDB A,[POINT 9,JOBUUO,OPFLD] ;get opcode
CAIL A,UUOMIN ;what
CAILE A,UUOMAX ;is it?
JRST ILLUUO ;an illegal opcode
JRST @ERRTAB-UUOMIN(A) ;or LISP error
ERRTAB: ERROR1 ;1 ;ordinary LISP error
ERRORG ;2 ;space overflow error
ERROR2 ;3 ;ill. mem. ref.
STRTYP ;4 ;print error message and continue
ERRORG: SKIPN P,ERRTN ;if in errset, restore p to that level
MOVE P,C2 ;else to top level
;and attempt to print message
ERROR1: SKIPN ERRSW
JRST ERREND ;dont print message, call (err nil)
PUSHJ P,ERRIO ;print message on tty
PUSHJ P,TERPRI
PUSHJ P,ERRSUB ;print the message
JRST ERRBK ;go the backtrace
STRTYP: PUSHJ P,ERRIO
PUSHJ P,ERRSUB ;print message and continue
PUSHJ P,OUTRET
JRST @UUOH
ERROR2: CDR A,JOBUUO
MOVEI B,[SIXBIT / ILL MEM REF FROM !/]
JRST ERSUB2
ILLUUO: CDR A,UUOH
MOVEI B,[SIXBIT / ILL UUO FROM !/]
ERSUB2: SKIPN ERRSW
JRST ERREND ;dont print message
PUSH P,A
PUSH P,B
PUSHJ P,ERRIO
PUSHJ P,TERPRI
PUSHJ P,PRINL2 ;print number
POP P,A
STRTIP (A) ;print message
POP P,R
PUSHJ P,ERSUB3 ;print nearest oblist match
ERRBK: SKIPE BACTRF#
PUSHJ P,BKTRC ;print backtrace
PUSHJ P,OUTRET ;return to previous device
ERREND: MOVEI A,0 ;(err nil)
SKIPN ERRTN
JRST [CLRBFI ;clear INPUT buffer
SKIPE RSTSW
JRST LISP2 ;(*rset t) goes to
;read-eval-print loop without unbinding.
JRST LSPRET] ;unbind and go to top level
ERR: SKIPN ERRTN
JRST LSPRET ;not in an errset, or bad error -
; - go to top level
MOVE P,ERRTN
ERR1: POP P,B
PUSHJ P,UBD ;unbind to previous errset
POP P,ERRSW
POP P,ERRTN
JRST ERRP4 ;and proceed
ERRSET: PUSH P,PA3
PUSH P,PA4
PUSH P,ERRTN
PUSH P,ERRSW
PUSH P,SP
MOVEM P,ERRTN
CDR C,(A)
CAR C,(C)
MOVEM C,ERRSW
CAR A,(A)
PUSHJ P,EVAL
PUSHJ P,NCONS
JRST ERR1
;error messages
DOTERR: SETZM OLDCH
ERR1 [ SIXBIT /DOT CONTEXT ERROR!/]
UNDFUN: CAR A,(AR1)
PUSHJ P,EPRINT
ERR1 [SIXBIT /UNDEFINED FUNCTION!/]
UNBVAR: PUSHJ P,EPRINT
ERR1 [SIXBIT /UNBOUND VARIABLE - EVAL!/]
NONNUM: ERR1 [SIXBIT /NON-NUMERIC ARGUMENT!/]
NOPNAM: ERR1 [SIXBIT /NO PRINT NAME - INTERN!/]
NOLIST: ERR1 [SIXBIT /NO LIST-MAKNAM!/]
TOMANY: ERR1 [SIXBIT /TOO MANY ARGUMENTS SUPPLIED - APPLY!/]
TOOFEW: ERR1 [SIXBIT /TOO FEW ARGUMENTS SUPPLIED - APPLY!/]
UNDTAG: PUSHJ P,EPRINT
ERR1 [SIXBIT /UNDEFINED FUNCTION - APPLY!/]
EG1: CDR A,T
PUSHJ P,EPRINT
ERR1 [SIXBIT /UNDEFINED PROG TAG-GO!/]
;backtrace subroutine
BKTRC: MOVEI D,-1(P)
MOVN A,BACTRF
ADDI A,INUM0
JUMPL A,[ ADD A,P ;backtrace specific number
JRST .+3]
SKIPN A,ERRTN ;backtrace to previous errset
MOVE A,C2 ;or top level
DAPZ A,BAKLEV#
STRTIP [SIXBIT /←BACKTRACE←!/]
BKTR2: CAMG D,BAKLEV
JRST FALSE ;done
CDR A,(D) ;get pdl element
CAMGE A,orgHWS
JUMPN A,.+2 ;this is (hopefully) a true program address
SOJA D,BKTR2 ;not a program address, continue
CAIN A,ILIST3
JRST BKTR1A ;argument evaluation
BKTR1B: CAIN A,CPOPJ
JRST [ CAR A,(D) ;calling a function
PUSHJ P,PRINC
XCT "-",CTY
STRTIP [SIXBIT /ENTER !/]
SOJA D,BKTR2]
CAR B,-1(A)
CAILE B,(<JCALLF 17,@(17)>)
CAIN B,(<PUSHJ P,>) ;tests for various types of calls
CAIGE B,(<FCALL>)
SOJA D,BKTR2 ;not a proper function call
PUSH P,-1(A) ;save object of function call
MOVEI R,-1(A) ;location of function call
PUSHJ P,ERSUB3 ;print closest oblist match
MOVEI A,"-"
PUSHJ P,TYO
POP P,R
TLNE R,17
CDR R,ERSUB3 ;qst -- cant handle indexed calls
HRRZS R
HLRO B,(R)
AOSN B
JRST [ CDR A,R ;was calling an atomic function
PUSHJ P,PRINC ;print its name
JRST .+2]
PUSHJ P,ERSUB3 ;was calling a code location -
; - print closest match
MOVEI A," "
PUSHJ P,TYO
BKTR1: SOJA D,BKTR2 ;continue
BKTR1A: CDR B,-1(D)
CAIE B,EXP2
CAIN B,ESB1
JRST .+2
JRST BKTR1B ;hum, not really evaluating arguments
HLRE B,-1(D)
ADD B,D
CAR A,-3(B)
JUMPE A,BKTR1
PUSHJ P,PRINC
XCT "-",CTY
STRTIP [SIXBIT /EVALARGS !/]
JRST BKTR1
BAKGAG: EXCH A,BACTRF
POPJ P,